﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using UricaoWeb.Datos.Excepciones.Seguridad_y_Roles;


namespace UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles
{
    public class Public_Class_Login
    {/// <summary>
        /// Metodo realizado para recibir y validar los datos del inicio de sesion del usuario     
        /// </summary>
        /// <param name="_usuariologin">El login del usuario</param>
        /// <param name="_contrasena">La contrasena para iniciar sesion</param>
        /// <returns>Retorna el objeto usario de la BD</returns>
        public static Usuario login(string _usuariologin, string _contraseña)
        {

            Usuario _user = new Usuario();
            OperacionesBD _conexionBd = new OperacionesBD();
            SqlCommand com = new SqlCommand("ValidarUsuario", _conexionBd._cn);

            com.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@nombreUsuario", _usuariologin);
            SqlParameter p2 = new SqlParameter("@claveUsuario", _contraseña);
            com.Parameters.Add(p1);
            com.Parameters.Add(p2);
            SqlDataReader reader;
            try
            {
                _conexionBd._cn.Open();
                reader = com.ExecuteReader();
                if (reader.Read())
                {
                    _user.IdUsuario = reader["IdUsuario"].ToString();
                    _user.NombreEmpleado = reader["nombreUsuario"].ToString();
                    _user.FkEmpleado = reader["fkEmpleado"].ToString();
                    _user.NombreEmpleado = reader["nombreEmpleado"].ToString();
                    _user.ApellidoEmpleado = reader["apellidoEmpleado"].ToString();
                    _user.CorreoEmpleado = reader["correoEmpleado"].ToString();
                    _user.FkHotel = reader["fkHotel"].ToString();
                }

                return _user;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SDlog-1", "Demasiadas peticiones al metodo Login", e);
            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SDlog-1", "El usuario no existe en la Base de Datos", e);

            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SDlog-1","El usuario no existe en la Base de Datos",e);
                
            }
            finally
            {
                _conexionBd._cn.Close();
            }

        }

        /// <summary>
        /// Metodo realizado para recordar el nombre de un usuario en caso de ser olvidado al iniciar sesion    
        /// </summary>
        /// <param name="_nombreUsuario">El nombre del usuario</param>
        /// <param name="_apellidoUsuario">El apellido del usuario</param>
        /// <param name="_correoUsuario">El correo del usuario</param>
        /// <returns>Retorna el objeto usario de la BD</returns>
        public static string recordarUsuario(string _nombreUsuario, string _apellidoUsuario, string _correoUsuario)
        {
            //string strcon = "Data Source=.;uid=sa;pwd=Password$2;database=master";
            //SqlConnection con = new SqlConnection(strcon);
            OperacionesBD _conexionBd = new OperacionesBD();
            string _user;
            SqlCommand com = new SqlCommand("RecordarUsuario", _conexionBd._cn);
            com.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@nombreUsuario", _nombreUsuario);
            SqlParameter p2 = new SqlParameter("@apellidoUsuario", _apellidoUsuario);
            SqlParameter p3 = new SqlParameter("@correoEmpleado", _correoUsuario);
            com.Parameters.Add(p1);
            com.Parameters.Add(p2);
            com.Parameters.Add(p3);
            SqlDataReader reader;
            try
            {
                _conexionBd._cn.Open();
                reader = com.ExecuteReader();
                _user = " ";
                if (reader.Read())
                {
                    _user = reader["nombreUsuario"].ToString();
                }
                return (_user);
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SDRecu-1", "Demasiadas peticiones al metodo recordarUsuario", e);

            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SDRecu-1", "El usuario no existe en la Base de Datos", e);

            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SDRecu-1", "El usuario no existe en la Base de Datos", e);

            }
            finally
            {
                _conexionBd._cn.Close();
            }

        }

        /// <summary>
        /// Metodo realizado para verificar que un usuario existe al olvidar la contraseña   
        /// </summary>
        /// <param name="_nombreUsuario">El nombre del usuario</param>  
        /// <returns>Retorna el objeto usario de la BD</returns>
        public static string VeficarUsuario(String _nombreUsuario)
        {
            OperacionesBD _conexionBd = new OperacionesBD();
            string _user;
            SqlCommand com = new SqlCommand("VeficarUsuario", _conexionBd._cn);
            com.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@nombreUsuario", _nombreUsuario);
            com.Parameters.Add(p1);
            SqlDataReader reader;
            try
            {
                _conexionBd._cn.Open();
                reader = com.ExecuteReader();
                _user = " ";
                if (reader.Read())
                {
                    _user = reader["IdUsuario"].ToString();
                }
                return _user;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SDveru-1", "Demasiadas peticiones al metodo verificarUsuario", e);

            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SDveru-1", "El usuario no existe en la Base de Datos", e);

            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SDveru-1", "El usuario no existe en la Base de Datos", e);

            }
            finally
            {
                _conexionBd._cn.Close();
            }
        }     
        
        /// <summary>
        /// Metodo realizado para verificar que el correo del usuario existe al olvidar la contraseña   
        /// </summary>
        /// <param name="_nombreUsuario">El nombre del usuario</param> 
        ///<param name="_idUsuario">El id del usuario</param> 
        /// <returns>Retorna el objeto usario de la BD</returns>
        public static String VeficarCorreo(String _nombreUsuario, int _idUsuario)
        {
            OperacionesBD _conexionBd = new OperacionesBD();
            string _user;
            SqlCommand com = new SqlCommand("VerificarCorreo", _conexionBd._cn);
            com.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@nombreUsuario", _nombreUsuario);
            SqlParameter p2 = new SqlParameter("@idUsuario", _idUsuario);
            com.Parameters.Add(p1);
            com.Parameters.Add(p2);
            SqlDataReader reader;
            try
            {
                _conexionBd._cn.Open();
                reader = com.ExecuteReader();
                _user = " ";
                if (reader.Read())
                {
                    _user = reader["correoEmpleado"].ToString();
                }
                return _user;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SDverc-1", "Demasiadas peticiones al metodo validarCorreo", e);

            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SDverc-1", "El correo no existe en la Base de Datos", e);

            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SDverc-1", "El correo no existe en la Base de Datos", e);

            }
            finally
            {
                _conexionBd._cn.Close();
            }
        }

        /// <summary>
        /// Metodo realizado para actualizar la contraseña en la BD cuando es olvidada por el usuario
        /// </summary>
        /// <param name="_idUsuario">el id del usuario</param> 
        ///<param name="_nuevaContraseña">la contraseña actualizada del usuario</param> 
        /// <returns>Retorna un booleano</returns>
        public static bool actualizarContrasena(String _idUsuario, String _nuevaContrasena)
        {
            OperacionesBD _conexionBd = new OperacionesBD();
            SqlCommand com = new SqlCommand("ActualizarContrasena", _conexionBd._cn);
            com.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@idUsuario", _idUsuario);
            SqlParameter p2 = new SqlParameter("@claveUsuario", _nuevaContrasena);
            com.Parameters.Add(p1);
            com.Parameters.Add(p2);
            try
            {
                _conexionBd._cn.Open();
                int i = com.ExecuteNonQuery();
                if (i > 0)
                {
                    return true;
                }
                return false;
            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SDaccon-1", "No se pudo actualizar la contraseña", e);
            }

            finally
            {
                _conexionBd._cn.Close();
            }
        }      
    }
}